﻿using CodeSaude.Application.Interfaces;
using CodeSaude.Application.ViewModels;
using CodeSaude.Domain.Enums;
using CodeSaude.Infrastructure.CrossCutting.Util;
using CodeSaude.Web.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

namespace CodeSaude.Web.Controllers
{
    public class PessoaController : Controller
    {
        private readonly IPessoaApplicationService _pessoaApplication;

        public PessoaController(IPessoaApplicationService pessoaApplication)
        {
            _pessoaApplication = pessoaApplication;
        }

        public ActionResult Index()
        {
            ViewBag.Title = "Pessoa";
            IList<PessoaViewModel> lst = new List<PessoaViewModel>();
            lst = _pessoaApplication.GetAll().ToList();

            if (TempData["Mensagem"] != null)
            {
                ViewBag.Mensagem = TempData["Mensagem"] as Mensagem;
            }

            return View(lst);
        }

        public ActionResult Create()
        {
            ViewBag.Title = "Inserir pessoa";

            PessoaViewModel model = new PessoaViewModel()
            {
                ListaSituacoes = EnumUtil.GetEnumSelectList<SituacaoEnum>(1)
            };

            return View("CreateEdit", model);
        }

        [HttpPost]
        public ActionResult Create(PessoaViewModel model)
        {
            Mensagem msg = null;
            
            try
            {
                if (ModelState.IsValid)
                {

                    

                    
                        _pessoaApplication.Create(model);
                        msg = new Mensagem()
                        {
                            Conteudo = "Pessoa cadastrada com sucesso",
                            tipoMensagem = TipoMensagem.SUCESSO
                        };
                    


                    TempData["Mensagem"] = msg;
                }

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                msg = new Mensagem()
                {
                    Conteudo = string.Concat("Erro ao salvar pessoa. Detalhes: ", ex.Message),
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }

        public ActionResult Edit(int id)
        {
            try
            {
                ViewBag.Title = "Alterar pessoa";
                PessoaViewModel model = new PessoaViewModel();
                model = _pessoaApplication.GetById(id);
                model.ListaSituacoes = EnumUtil.GetEnumSelectList<SituacaoEnum>(1);
                return View("CreateEdit", model);
            }
            catch (Exception)
            {
                Mensagem msg = new Mensagem()
                {
                    Conteudo = "Não foi possível carregar a pessoa",
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }

        }

        [HttpPost]
        public ActionResult Edit(PessoaViewModel model)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    _pessoaApplication.Update(model);

                    Mensagem msg = new Mensagem()
                    {
                        Conteudo = "Pessoa alterado com sucesso",
                        tipoMensagem = TipoMensagem.SUCESSO
                    };

                    TempData["Mensagem"] = msg;
                }

                return RedirectToAction("Index");
            }
            catch
            {
                Mensagem msg = new Mensagem()
                {
                    Conteudo = "Erro ao alterar pessoa",
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }

        [HttpPost]
        public ActionResult Delete(int id)
        {
            Mensagem msg = null;

            try
            {
                PessoaViewModel pessoa = _pessoaApplication.GetById(id);
                _pessoaApplication.Delete(pessoa);

                msg = new Mensagem()
                {
                    Conteudo = "Pessoa excluída com sucesso",
                    tipoMensagem = TipoMensagem.SUCESSO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                msg = new Mensagem()
                {
                    Conteudo = string.Concat("Erro ao excluir pessoa. Detalhes: ", ex.Message),
                    tipoMensagem = TipoMensagem.ERRO
                };

                TempData["Mensagem"] = msg;
                return RedirectToAction("Index");
            }
        }
    }
}
